home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 7: Sunsite / Linux Cubed Series 7 - Sunsite Vol 1.iso / system / network / admin / xinetd.2 / xinetd / xinetd.2.1.7-linux.4 / libs / src / misc / gcvt.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-06-01  |  1.3 KB  |  73 lines

  1. /*
  2.  * $Id: gcvt.c,v 1.3 1995/06/01 02:26:37 chuck Exp $
  3.  *
  4.  * cvt.c - IEEE floating point formatting routines for FreeBSD
  5.  * from GNU libc-4.6.27
  6.  */
  7.  
  8. #include <stdlib.h>
  9.  
  10. /*
  11.  * gcvt  - Floating output conversion to
  12.  * minimal length string
  13.  */
  14.  
  15. extern char* ecvt(double arg, size_t ndigits, int *decpt, int *sign);
  16.  
  17. char *
  18. gcvt(double number, size_t ndigit, char *buf)
  19. {
  20.     int sign, decpt;
  21.     register char *p1, *p2;
  22.     register i;
  23.  
  24.     p1 = ecvt(number, ndigit, &decpt, &sign);
  25.     p2 = buf;
  26.     if (sign)
  27.         *p2++ = '-';
  28.     for (i=ndigit-1; i>0 && p1[i]=='0'; i--)
  29.         ndigit--;
  30.     if ((decpt >= 0 && decpt-ndigit > 4)
  31.      || (decpt < 0 && decpt < -3)) { /* use E-style */
  32.         decpt--;
  33.         *p2++ = *p1++;
  34.         *p2++ = '.';
  35.         for (i=1; i<ndigit; i++)
  36.             *p2++ = *p1++;
  37.         *p2++ = 'e';
  38.         if (decpt<0) {
  39.             decpt = -decpt;
  40.             *p2++ = '-';
  41.         } else
  42.             *p2++ = '+';
  43.         if (decpt/100 > 0)
  44.           *p2++ = decpt/100 + '0';
  45.         if (decpt/10 > 0)
  46.           *p2++ = (decpt%100)/10 + '0';
  47.         *p2++ = decpt%10 + '0';
  48.     } else {
  49.         if (decpt<=0) {
  50.             if (*p1!='0')
  51.                 *p2++ = '.';
  52.             while (decpt<0) {
  53.                 decpt++;
  54.                 *p2++ = '0';
  55.             }
  56.         }
  57.         for (i=1; i<=ndigit; i++) {
  58.             *p2++ = *p1++;
  59.             if (i==decpt)
  60.                 *p2++ = '.';
  61.         }
  62.         if (ndigit<decpt) {
  63.             while (ndigit++<decpt)
  64.                 *p2++ = '0';
  65.             *p2++ = '.';
  66.         }
  67.     }
  68.     if (p2[-1]=='.')
  69.         p2--;
  70.     *p2 = '\0';
  71.     return(buf);
  72. }
  73.